﻿/*
*  用途：easyui combobox级联查询
*  Jquery全局插件
*  
*/
jQuery.LoadComboboxs = function (cbDatas) {


    if (cbDatas == null || cbDatas.length < 1) return;

    $(cbDatas).each(function () {
        //  _initCombobox(this);
        _initComboboxEvent(this);
        _loadFirstData(this); //加载第一个combobox数据
    });

    $(window).bind("unload.LoadComboboxs", function () {
        if ($) {
            $(cbDatas).each(function () {//销毁combobox 
                $("#" + this.id).combobox("destroy");
            });
        }
    });

    return this; //保持Jquery链

    //----------------------------------  Start Function Define --------------------------------------------------//

    //重置Combobox信息
    function _resetComboBox(jID) {
        //事件解绑定
        var customCall = $(jID).combobox("options").onSelect;
        $(jID).combobox("options").onSelect = function () { };

        $(jID).combobox("clear");
        $(jID).combobox("loadData", []);

        //重新绑定
        $(jID).combobox("options").onSelect = customCall;
    }

    function _resetCascadeNext(jsonComboData) {
        if (typeof jsonComboData.next != "undefined" && jsonComboData.next != null) {
            $(jsonComboData.next).each(function () {//遍历下级
                var next = this;
                if (typeof next.id != "undefined" && next.id != null) {
                    _resetComboBox("#" + next.id); //自己加载数据则清空下级级联combobox内容
                    _resetCascadeNext(next); //递归下级，寻找下级的下级
                }
            });
        }
    }

    //    //初始化combobox
    //    function _initCombobox(jsonComboData) {
    //        if (typeof jsonComboData.NeedInit != "undefined" && jsonComboData.NeedInit == true) {
    //            //需要初始化
    //            var defaultOptions = {
    //                valueField: 'id',
    //                textField: 'text'
    //            };
    //            var id = "#" + jsonComboData.id;
    //            $(id).combobox(defaultOptions); //初始化 
    //        }
    //    }

    //重置Combobox事件
    function _initComboboxEvent(jsonComboData) {
        var id = "#" + jsonComboData.id;

        $.extend($(id).combobox("options"), jsonComboData.comboboxOptions, { _jsonComboData: jsonComboData });
        var customCall = $(id).combobox("options").onSelect;

        $(id).combobox("options").onLoadSuccess = function () {

            //            if (typeof jsonComboData.next != "undefined" && jsonComboData.next != null) {
            //                $(jsonComboData.next).each(function () {
            //                    var next = this;
            //                    if (typeof next.id != "undefined" && next.id != null) {
            //                        _resetComboBox("#" + next.id); //自己加载数据则清空下级级联combobox内容
            //                    }
            //                });
            //            }
            _resetCascadeNext(jsonComboData); //加载成功清除所有下级
            _initComboData(id, jsonComboData); //加载成功选择自己的默认值
        };
        $(id).combobox("options").onLoadError = function () {
            //            if (typeof jsonComboData.next != "undefined" && jsonComboData.next != null) {
            //                $(jsonComboData.next).each(function () {
            //                    var next = this;
            //                    if (typeof next.id != "undefined" && next.id != null) {
            //                        _resetComboBox("#" + next.id); //自己加载数据则清空下级级联combobox内容
            //                    }
            //                });
            //            }
            _resetCascadeNext(jsonComboData); //加载失败也清除所有下级
        }; //自己加载数据则清空下级级联combobox内容



        $(id).combobox("options").onSelect = function (data) {

            if (typeof jsonComboData.next != "undefined" && jsonComboData.next != null) {
                $(jsonComboData.next).each(function () {
                    var next = this;
                    if (typeof next.id != "undefined" && next.id != null) {
                        var nextParams = next.params;
                        var url = next.url;
                        if (typeof url != "undefined" && url != null) {
                            if (typeof nextParams != "undefined" && nextParams != null && nextParams.length > 0) {
                                for (var name in nextParams) {
                                    url = setUrlParam(url, name, nextParams[name]);
                                }
                            }
                            $("#" + next.id).combobox("options").url = url;
                        }
                        //_resetComboBox("#" + next.id); //自己加载数据则清空下级级联combobox内容
                    }
                });
            }
            _resetCascadeNext(jsonComboData); //选择数据时清除所有下级
            customCall(data); //调用参数传入的用户自定义onSelect方法
        }

    }

    function _loadFirstData(jsonComboData) {
        if (jsonComboData != undefined && jsonComboData.isFirst == true) {
            var id = "#" + jsonComboData.id;
            var params = jsonComboData.params;
            var url = jsonComboData.url;
            if (url == undefined || url == null) return;
            if (params != undefined && params != null && params.length > 0) {
                for (var name in params) {
                    url = setUrlParam(url, name, params[name]);
                }
            }
            $(id).combobox("reload", url);
        }
    }

    function _initComboData(jID, jsonComboData) {
        var datas = $(jID).combobox("getData");
        if (datas == null || datas.length < 1) return;
        $(datas).each(function () {
            if (jsonComboData.defaultValue != undefined && jsonComboData.defaultValue != null) {
                if (jsonComboData.defaultValue == this[$(jID).combobox("options").valueField]) {
                    //select方法可以直接触发onselect
                    $(jID).combobox("select", this[$(jID).combobox("options").valueField]);
                    return false;
                }
            }
        });
    }
};



/*
* ---------------------------------------------------------- 用途：工具插件  
* ---------------------------------------------------------- Jquery全局插件
*  
*/
/*
* 类型转换 将data转换为defaultValue类型
* Author:mayan
*
*
*  dafaultValue是函数类型则做对象劫持：
*     把data对象作为函数的this指针，函数参数在defaultValue之后顺序传入，例如 $.SaicTool.Convert(window.top,fun1,"1","2")

*  dafaultValue 是日期类型
*     data必须是json对象 year,month,day,hour,minute,second 属性按需配置，如果缺失，使用defaultValue的Date对象中数据
*
*  dafaultValue 类型是object
*      data转defaultValue类型的对象，属性值以dafaultValue为默认值
*
*  dafaultValue 类型是array
*      返回array对象，内含data数据
*
*  data 是日期类型，defaultValue传入格式化字符串 => date 转 格式化string
*
*/
jQuery.SaicConvert = function(data, defaultValue) {

    if ($.type(defaultValue) == "undefined" || $.type(defaultValue) == "null") return data; //defaultValue为不存在，直接返回data

    if ($.type(data) === "null" || $.type(data) === "undefined") {
        return defaultValue;
    }

    if ($.type(defaultValue) === "function") {
        defaultValue.apply(data, Array.prototype.slice.call(arguments, 2));
    }

    if ($.type(data) === "date" && $.type(defaultValue) === "string") {
        return FormatDate(data, defaultValue);
    }

    var retValue = defaultValue;

    switch ($.type(defaultValue)) {
        case "number":
            retValue = Number(data);
            if (isNaN(retValue)) return defaultValue;
            return retValue;
        case "boolean":
            retValue = Boolean(data);
            return retValue;
        case "string":
            return String(data);
        case "array":
            if ($.type(data) === "array") {
                return data;
            }
            retValue = new Array();
            retValue.push(data);
            return retValue;
        case "date":
            var defaultDateJson = {
                year: defaultValue.getFullYear(),
                month: defaultValue.getMonth(),
                day: defaultValue.getDate(),
                hour: defaultValue.getHours(),
                minute: defaultValue.getMinutes(),
                second: defaultValue.getSeconds()
            };
            if ($.type(data) === "object") {
                var dateJson = {
                    year: data.year,
                    month: data.month,
                    day: data.day,
                    hour: data.hour,
                    minute: data.minute,
                    second: data.second
                };
                retValue = $.extend(defaultDateJson, dateJson);
                return new Date(defaultDateJson.year, defaultDateJson.month - 1, defaultDateJson.day, defaultDateJson.hour, defaultDateJson.minute, defaultDateJson.second);
            }
            return defaultValue;
        case "object":
            var Data = data;
            if ($.type(data) === "string") {
                try {
                    Data = eval("(" + unescape(data) + ")");
                } catch (error) {
                    Data = data;
                }
            }
            return $.extend(defaultValue, Data);
        default: return data;
    }



    //date类型转成string  

    /**      
 
* 对Date的扩展，将Date 转化为指定格式的String      
 
* 月(M)、日(d)、12小时(h)、24小时(H)、分(m)、秒(s)、周(E)、季度(q) 可以用1-2 个占位符      
 
* 年(y)可以用1-4 个占位符，毫秒(S)只能用1 个占位符(是1-3 位的数字)      
 
* eg:      
 
* FormatDate(new Date(),"yyyy-MM-dd hh:mm:ss.S") ==> 2013-03-21 11:12:04.423      
 
* FormatDate(new Date(),"yyyy-MM-dd E HH:mm:ss") ==> 2013-03-21 二13:12:04      
 
* FormatDate(new Date(),"yyyy-MM-dd EE hh:mm:ss") ==> 2013-03-21 周二01:02:04      
 
* FormatDate(new Date(),"yyyy-MM-dd EEE hh:mm:ss") ==> 2013-03-21 星期二01:02:04       
 
* FormatDate(new Date(),"yyyy-M-d h:m:s.S") ==> 2013-03-21 1:2:4.18      
 
*/
    function FormatDate(date, fmt) {

        var o = {
            "M+": date.getMonth() + 1, //月份
            "d+": date.getDate(), //日
            "h+": date.getHours() % 12 == 0 ? 12 : date.getHours() % 12, //小时
            "H+": date.getHours(), //小时
            "m+": date.getMinutes(), //分
            "s+": date.getSeconds(), //秒
            "q+": Math.floor((date.getMonth() + 3) / 3), //季度
            "S": date.getMilliseconds() //毫秒 
        };

        var week = {
            "0": "\u65e5",
            "1": "\u4e00",
            "2": "\u4e8c",
            "3": "\u4e09",
            "4": "\u56db",
            "5": "\u4e94",
            "6": "\u516d"
        };

        if (/(y+)/.test(fmt)) {
            fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
        }

        if (/(E+)/.test(fmt)) {
            fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "\u661f\u671f" : "\u5468") : "") + week[date.getDay() + ""]);
        }

        for (var k in o) {
            if (new RegExp("(" + k + ")").test(fmt)) {
                fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
            }
        }

        return fmt;

    }

};


/*
*  用途：Window Resize插件
*  Jquery window对象插件，window大小最后一次改变后150ms触发
*  调用方式：  $(window).afterResize(function(){  });
*  Author: MaYan
*/
(
    function($) {

        var isResizing = false;

        //窗口改变时，复位信号
        function WindowResize(plugWindow) {
            var jq = plugWindow.$;
            jq(plugWindow).data("_ResizeWindow_dog", 0); //复位resize信号
        }

        function CheckAndFireEvent(plugWindow, CallBack, callBackArgs) {
            var jq = plugWindow.$;
            var timID = setInterval(function() {
                var cnt = jq(plugWindow).data("_ResizeWindow_dog");
                if (0 === cnt) {
                    jq(plugWindow).data("_ResizeWindow_dog", 2); //resize信号置位（2次后出发AfterResize事件）
                    return;
                }
                else {
                    if (cnt <= 1) {//置位一次150ms,再减一次，共计300ms后为true
                        isResizing = false;
                        clearInterval(timID);
                        timID = null;
                        jq(plugWindow).removeData("_ResizeWindow_dog");
                        CallBack.apply(plugWindow, callBackArgs); //窗口不再改变大小300ms后，调回调钩子函数触发事件
                    }
                    else {
                        jq(plugWindow).data("_ResizeWindow_dog", --cnt);
                    }
                }
            }, 75); //end Interval
        }

        $.extend($.fn, {

            afterResize: function() {
                var plug = this;
                var method = arguments[0];
                var args = Array.prototype.slice.call(arguments, 1);

                if (!$.isFunction(method)) return; //参数不是回调函数，不做任何操作
                if ($.isWindow(plug[0])) {
                    var plugWindow = plug[0];
                    var jq = plugWindow.$;
                    plug.on("resize", function() {
                        WindowResize(plugWindow);
                        if (!isResizing) {
                            isResizing = true;
                            CheckAndFireEvent(plugWindow, method, args);
                        } //仅注册一次定时器
                    });
                }
            }
        });
    } //
)(jQuery);


/*
*  用途：文本框 回车 或 值改变后离开焦点 触发事件
*  文本框空值不响应此事件
*  调用方式：  $(":input[type=text]").changeOrEnter(function(){  ...  });
*  Author: MaYan
*/
(
    function($) {

        $.extend($.fn, {

            changeOrEnter: function(Callback) {
                if ($.type(Callback) !== "function") {
                    return;
                }
                var jEle = $(this);

                jEle.blur(function() {
                    var val = $.trim($(this).val());
                    var lastVal = $(this).data("LASTVAL");

                    if (val !== lastVal) {//输入数据并且和上次不同，响应事件
                        $(this).data("LASTVAL", val);
                        //alert("do callback");
                        Callback.call(this);

                    }
                }); //end blur


                jEle.on("keyup", function(e) {
                    if (e.keyCode == 13) {
                        var val = $.trim($(this).val());
                        var lastVal = $(this).data("LASTVAL");

                        if (val !== "" && val === lastVal) {
                            Callback.call(this); //值没有改变也要响应回车回调
                        }
                        else {
                            $(this).blur();
                        }

                        if (val == "") {//如果文本框中没有值，回调后要再次获得焦点
                            $(this).focus();
                        }
                    }
                }); //end keyup

                jEle = null;
            }

        });
    }
)(jQuery);